/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.plan.manager;

import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;
import com.brain.core.manager.*;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.plan.dto.CalculoDto;
import com.brain.plan.dto.PerTrabConDto;
import com.brain.plan.dto.PeriodoRemunDto;
import com.brain.plan.view.util.ConstantesPlan;
import com.brain.sgc.dto.PersonaDto;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.annotation.Resource;
import net.sf.jasperreports.engine.JRException;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author Greip Company
 * @since 09/01/2014
 * @version 1.0
 */
@Service
public class CalculoManager extends ComunManager<CalculoDto> implements Serializable {

    /**
     * Logger permite registrar los errores que ocurren
     * @since 09/01/2014
     */
    private static Logger logger = Logger.getLogger(CalculoManager.class);
    
    /**
     * idEntidad utilizado para construir los títulos de los paneles de la entidad
     * @since 09/01/2014
     */
    private Long idEntidad = 282L;
    
    /**
     * applicationMBean permite obtener diferentes valores de la aplicación, como acciones y estilos
     * @since 09/01/2014
     */
    @Autowired
    private ApplicationMBean applicationMBean;
    
    /**
     * springHibernateDao usado para realizar las operaciones de listar, guardar, eliminar
     * @since 09/01/2014
     */
    @Resource
    private DAOGenerico<CalculoDto> springHibernateDao;
    
    /**
     * recursosManager permite mostrar mensajes en las vistas
     * @since 09/01/2014
     */
    @Resource
    private RecursosManager recursosManager;
    
    /**
     * periodoManager: comunica a la vista con la capa de negocio de la entidad PeriodoDto
     * @since 10/01/2014
     */
    @Resource
    private PeriodoManager periodoManager;
    
    /**
     * url dirección de la pagina calculoPlanilla.xhtml
     * @since 09/01/2014
     */
    private final String url = "/pages/plan/calculo/calculoPlanilla.xhtml";
    
    /**
     * urlLista dirección de la pagina listaCalculoPlanilla.xhtml
     * @since 09/01/2014
     */
    private final String urlLista = "/pages/plan/calculo/listaCalculoPlanilla.xhtml";

    /**
     * Metodo que permite obtener la entidad CalculoDto usado el id como filtro
     * @since 09/01/2014
     * @param id usado para realizar la búsqueda de la entidad
     * @throws DAOException
     * @return entidad CalculoDto
     */
    public CalculoDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(CalculoDto.class, id);
    }

    /**
     * Metodo que permite inicializar la entidad CalculoDto
     * @since 09/01/2014
     * @return entidad CalculoDto
     */
    public CalculoDto inicializar() {

        CalculoDto dto = new CalculoDto();
        dto.setFolioPlanilla("");
        dto.setNumBoleta("");

        return dto;
    }

    /**
     * Metodo que obtiene un listado de la entidad CalculoDto, tomando como parametro a la entidad CalculoDto
     * @since 09/01/2014
     * @param dto entidad usada para realizar la búsqueda
     * @throws DAOException
     * @return listado de la entidad CalculoDto
     */ 
    public List<CalculoDto> obtener(CalculoDto dto) throws DAOException {
        String query = "select e from CalculoDto as e where e.id=e.id";
        List<Object> listaParametros = new ArrayList<Object>();

        if (dto.getId() != null && !dto.getId().equals(0L)) {
            query += " and e.id = ?";
            listaParametros.add(dto.getId());
        } else {
            if (dto.getNumBoleta() != null && dto.getNumBoleta().length() > 0) {
                query += " and upper(e.numBoleta) like '%" + dto.getNumBoleta().toUpperCase() + "%'";
            }

            if (dto.getFolioPlanilla() != null && dto.getFolioPlanilla().length() > 0) {
                query += " and upper(e.folioPlanilla) like '%" + dto.getFolioPlanilla().toUpperCase() + "%'";
            }
        }
        query += " order by e.fechaCreacion";

        return springHibernateDao.ejecutarQuery(query, listaParametros);
    }

    /**
     * obtenerCantCalculosPorPeriodo(): obtiene la cantidad de calculos por periodo
     * @since 10/01/2014
     * @param dto
     * @return retorna un entero indicando la cantidad obtenida
     * @throws DAOException 
     */
    public Integer obtenerCantCalculosPorPeriodo(CalculoDto dto) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();
        String query = "select count(e.id) from CalculoDto as e";
        query += " where e.periodoDto.id = ?";
        listaParametros.add(dto.getPeriodoDto().getId());
        return Integer.parseInt(springHibernateDao.ejecutarQueryGeneric(query, listaParametros).get(0).toString());
    }

    /**
     * obtenerCantPorBol(): obtiene la cantidad de entidades CalculoDto basandose en el número de boleta
     * @since 10/01/2014
     * @param dto
     * @return retorna un entero indicando la cantidad obtenida
     * @throws DAOException 
     */
    public Integer obtenerCantPorBol(CalculoDto dto) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        List<Object> listaParametros = new ArrayList<Object>();
        String query = "select count(e.id) from CalculoDto as e";
        query += " where e.periodoDto.organizacionDto.id = ?";
        listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        query += " and e.numBoleta = '" + dto.getNumBoleta() + "'";
        if (dto.getId() != null) {
            query += " and e.id <> ?";
            listaParametros.add(dto.getId());
        }
        return Integer.parseInt(springHibernateDao.ejecutarQueryGeneric(query, listaParametros).get(0).toString());
    }

    /**
     * obtenerCantPorFolio(): obtiene la cantidad de entidades CalculoDto basandose en el folio de planilla
     * @since 10/01/2014
     * @param dto
     * @return retorna un entero indicando la cantidad obtenida
     * @throws DAOException 
     */
    public Integer obtenerCantPorFolio(CalculoDto dto) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        List<Object> listaParametros = new ArrayList<Object>();
        String query = "select count(e.id) from CalculoDto as e";
        query += " where e.periodoDto.organizacionDto.id = ?";
        listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        query += " and e.folioPlanilla = '" + dto.getFolioPlanilla() + "'";
        if (dto.getId() != null) {
            query += " and e.id <> ?";
            listaParametros.add(dto.getId());
        }
        return Integer.parseInt(springHibernateDao.ejecutarQueryGeneric(query, listaParametros).get(0).toString());
    }

    /**
     * obtenerDetalles(): obtiene los detalles tomando como parámetro el idCalculo
     * @since 10/01/2014
     * @param idCalculo
     * @return retorna un listado de la entidad PeriodoRemunDto
     */
    public List<PeriodoRemunDto> obtenerDetalles(Long idCalculo) {
        List<PeriodoRemunDto> lista = null;
        PeriodoRemunManager periodoRemunManager = (PeriodoRemunManager) WebServletContextListener.getApplicationContext().getBean("periodoRemunManager");
        try {
            lista = periodoRemunManager.obtenerPorCalculo(idCalculo);
        } catch (DAOException ex) {
            logger.error(ex.getMessage());
            recursosManager.showError(ex.getMessage());
        }
        return lista;
    }

    /**
     * Metodo que permite guardar la entidad CalculoDto
     * @since 09/01/2014
     * @param dto entidad a guardar
     * @return retorna una cadena, que indica la página a mostrarse después de guardar la entidad
     */
    @Transactional(rollbackFor = Exception.class)
    public String guardar(CalculoDto dto) {
        String ir = "";
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        PeriodoRemunManager periodoRemunManager = (PeriodoRemunManager) WebServletContextListener.getApplicationContext().getBean("periodoRemunManager");
        dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
        dto.setTerminal(sessionMBean.getSessionTerminal());
        dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
        try {
            if (obtenerCantPorBol(dto) <= 0) {
                if (obtenerCantPorFolio(dto) <= 0) {
                    List<PeriodoRemunDto> listaDetalles = new ArrayList<PeriodoRemunDto>();
                    if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
                        if (validarDatosCalculo(dto)) {
                            dto.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
                            dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                            dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());

                            UtilCore.General.toUpperCaseDto(dto);
                            nuevo(dto);

                            listaDetalles = guardarDetallesDelCalculo(dto);
                            periodoRemunManager.nuevoMuchos(listaDetalles);

                            //fin de calculos para cada empleado
                            mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                            recursosManager.showMessage(mensajeTrx);
                            ir = "";
                        } else {
                            mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("calculo.mensaje.1");
                            recursosManager.showError(mensajeTrx);
                            ir = null;
                        }
                    } else if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
                        UtilCore.General.toUpperCaseDto(dto);
                        editar(dto);
                        listaDetalles = guardarDetallesDelCalculo(dto);
                        periodoRemunManager.nuevoMuchos(listaDetalles);
                        guardarDetallesDelCalculo(dto);
                        mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                        recursosManager.showMessage(mensajeTrx);
                        ir = "";
                    }
                } else {
                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("calculo.mensaje.3");
                    recursosManager.showMessage(mensajeTrx);
                    ir = null;
                }
            } else {
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("calculo.mensaje.2");
                recursosManager.showMessage(mensajeTrx);
                ir = null;
            }
        } catch (Exception ex) {
            logger.error(ex.getMessage());
            recursosManager.showError(ex.getMessage());
            ir = null;
        }
        return ir;
    }

    /**
     * guardarDetallesDelCalculo(): guarda el detalle del calculo
     * @since 10/01/2014
     * @param dto
     * @return retorna un listado de entidades PeriodoRemunDto
     * @throws DAOException 
     */
    public List<PeriodoRemunDto> guardarDetallesDelCalculo(CalculoDto dto) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        PerTrabConManager perTrabConManager = (PerTrabConManager) WebServletContextListener.getApplicationContext().getBean("perTrabConManager");
        PeriodoRemunManager periodoRemunManager = (PeriodoRemunManager) WebServletContextListener.getApplicationContext().getBean("periodoRemunManager");
        ParametroManager parametroManager = (ParametroManager) WebServletContextListener.getApplicationContext().getBean("parametroManager");
        //Hacemos los calculos para cada empleado
        List<PersonaDto> lstEmpleados = periodoManager.obtenerEmpleadosPorPeriodo();
        List<PeriodoRemunDto> listaPR = new ArrayList<PeriodoRemunDto>();
        PeriodoRemunDto objPR = null;
        BigDecimal montoPorDia = BigDecimal.ZERO;
        BigDecimal montoPorHora = BigDecimal.ZERO;
        BigDecimal montoPorminuto = BigDecimal.ZERO;
        BigDecimal haberBasico = BigDecimal.ZERO;
        BigDecimal diasPeriodo = BigDecimal.ZERO;
        BigDecimal montoDescuentos = BigDecimal.ZERO;
        BigDecimal montoRemuneraciones = BigDecimal.ZERO;
        BigDecimal diasLicSinGH = BigDecimal.ZERO;
        BigDecimal faltas = BigDecimal.ZERO;
        BigDecimal minTardanzas = BigDecimal.ZERO;
        BigDecimal hExtras = BigDecimal.ZERO;
        BigDecimal hExtrasFerDesc = BigDecimal.ZERO;
        BigDecimal subsidios = BigDecimal.ZERO;
        BigDecimal asigFamiliar = BigDecimal.ZERO;
        BigDecimal remunVacacional = BigDecimal.ZERO;
        BigDecimal gratificacion = BigDecimal.ZERO;
        BigDecimal pagoNoRemun = BigDecimal.ZERO;
        BigDecimal bonificacion = BigDecimal.ZERO;
        BigDecimal onp = BigDecimal.ZERO;
        BigDecimal apTotalAfp = BigDecimal.ZERO;
        BigDecimal adtoRemuneracion = BigDecimal.ZERO;
        BigDecimal adtoVacaciones = BigDecimal.ZERO;
        BigDecimal dctoQuintaCat = BigDecimal.ZERO;
        BigDecimal prestamo = BigDecimal.ZERO;
        BigDecimal adtoOtros = BigDecimal.ZERO;
        BigDecimal dctoJudicial = BigDecimal.ZERO;
        BigDecimal dctosOtros = BigDecimal.ZERO;
        PerTrabConDto objComun = null;
        List<PerTrabConDto> listaConceptosPP = null;
        List<PerTrabConDto> listaConceptosParaUpdate = new ArrayList<PerTrabConDto>();
        //Parametro de horas extras feriados y descanzos
        ParametroDto parametroHEFDDto = parametroManager.obtenerPorId(ConstantesPlan.Parametro.HE_FD);
        for (PersonaDto e : lstEmpleados) {
            montoDescuentos = BigDecimal.ZERO;
            montoRemuneraciones = BigDecimal.ZERO;
            if (perTrabConManager.obtenerCantConceptosPorEmpYPeriodo(e.getId(), dto.getPeriodoDto().getId()) > 0) {
                listaConceptosPP = perTrabConManager.obtenerConceptosPorEmpYPeriodo(e.getId(), dto.getPeriodoDto().getId());
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.DIAS_PER);
                if (objComun != null) {
                    diasPeriodo = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.DIAS_PER).getValor();
                }

                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.HABER_BAS);
                if (objComun != null) {
                    haberBasico = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.HABER_BAS).getValor();
                }
                montoPorDia = obtenerMontoPorDiaLaborado(diasPeriodo, haberBasico);
                montoPorHora = obtenerMontoPorHoraLaborada(diasPeriodo, haberBasico);
                montoPorminuto = obtenerMontoPorMinutoLaborado(diasPeriodo, haberBasico);
                //Sumamos la primera remuneracion del trabajador que es su haber basico
                montoRemuneraciones = montoRemuneraciones.add(haberBasico);

                //Descontamos los dias  laborados sin coge de haber
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.DIAS_LICSG);
                if (objComun != null) {
                    diasLicSinGH = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.DIAS_LICSG).getValor();
                }
                montoDescuentos = montoDescuentos.add(montoPorDia.multiply(diasLicSinGH));

                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.DIAS_FALTA);
                if (objComun != null) {
                    faltas = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.DIAS_FALTA).getValor();
                    objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.FALTA_D);
                    objComun.setValor(montoPorDia.multiply(faltas));
                    listaConceptosParaUpdate.add(objComun);
                }
                montoDescuentos = montoDescuentos.add(montoPorDia.multiply(faltas));

                //Restamos las tardanzas {Las tardanzas estan en minutos}
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.TARDANZA);
                if (objComun != null) {
                    minTardanzas = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.TARDANZA).getValor();
                    objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.TARDZ_D);
                    objComun.setValor(montoPorminuto.multiply(minTardanzas));
                    listaConceptosParaUpdate.add(objComun);
                }
                montoDescuentos = montoDescuentos.add(montoPorminuto.multiply(minTardanzas));

                //Sumamos las horas extras laboradas
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.NHEXT1);
                if (objComun != null) {
                    hExtras = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.NHEXT1).getValor();
                    objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.HEXT1_REM);
                    objComun.setValor(montoPorHora.multiply(hExtras));
                    listaConceptosParaUpdate.add(objComun);
                }
                montoRemuneraciones = montoRemuneraciones.add(montoPorHora.multiply(hExtras));

                //Las horas extras en feriados y descanzos se apoyan en el parametro que almacen el porcentaje del monto por hora laborada
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.NHEXT_DF);
                BigDecimal montoRealPorHHFD = montoPorHora.add(UtilCore.Numero.dividir(montoPorHora, new BigDecimal(100), applicationMBean.getPrecisionDecimales()).multiply(parametroHEFDDto.getValorReal()));
                if (objComun != null) {
                    hExtrasFerDesc = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.NHEXT_DF).getValor();
                    objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.HEXTDF_REM);
                    objComun.setValor(montoRealPorHHFD.multiply(hExtrasFerDesc));
                    listaConceptosParaUpdate.add(objComun);
                }
                montoRemuneraciones = montoRemuneraciones.add(montoRealPorHHFD.multiply(hExtrasFerDesc));
                
                //Sumamos los subsidios percibidos
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.SUBSIDIO);
                if (objComun != null) {
                    subsidios = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.SUBSIDIO).getValor();
                }
                montoRemuneraciones = montoRemuneraciones.add(subsidios);


                //Sumamos la asignacion familiar
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.AS_FAM);
                if (objComun != null) {
                    asigFamiliar = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.AS_FAM).getValor();
                }
                montoRemuneraciones = montoRemuneraciones.add(asigFamiliar);

                //Sumamnos el total de vacaciones
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.TREM_VAC);
                if (objComun != null) {
                    remunVacacional = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.TREM_VAC).getValor();
                }
                montoRemuneraciones = montoRemuneraciones.add(remunVacacional);

                //Sumamos la gratificacion
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.GRATI);
                if (objComun != null) {
                    gratificacion = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.GRATI).getValor();
                }
                montoRemuneraciones = montoRemuneraciones.add(gratificacion);

                //Sumamos los otros pagos no remunerativos
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.OTR_PAG_NR);
                if (objComun != null) {
                    pagoNoRemun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.OTR_PAG_NR).getValor();
                }
                montoRemuneraciones = montoRemuneraciones.add(pagoNoRemun);

                //Sumamos las bonificaciones
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.BONIF);
                if (objComun != null) {
                    bonificacion = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.BONIF).getValor();
                }
                montoRemuneraciones = montoRemuneraciones.add(bonificacion);

                //Verificamos el regimen pensionario del trabajador
                if (e.getRegimen().equals(ConstantesPlan.ValoresConstantes.REGIMEN_PENSIONARIO_AFP)) {
                    //Aqui falta averguar como funciona la afp
                    objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.TOT_APOAFP);
                    if (objComun != null) {
                        apTotalAfp = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.TOT_APOAFP).getValor();
                    }
                    montoDescuentos = montoDescuentos.add(apTotalAfp);
                } else if (e.getRegimen().equals(ConstantesPlan.ValoresConstantes.REGIMEN_PENSIONARIO_ONP)) {
                    objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.ONP_P);
                    if (objComun != null) {
                        onp = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.ONP_P).getValor();
                    }
                    montoDescuentos = montoDescuentos.add(onp);
                }

                //Se descuentan los adelantos de rem y vaca
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.AD_REMUN);
                if (objComun != null) {
                    adtoRemuneracion = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.AD_REMUN).getValor();
                }
                montoDescuentos = montoDescuentos.add(adtoRemuneracion);

                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.ADEL_VAC);
                if (objComun != null) {
                    adtoVacaciones = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.ADEL_VAC).getValor();
                }
                montoDescuentos = montoDescuentos.add(adtoVacaciones);

                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.ADELOT_D);
                if (objComun != null) {
                    adtoOtros = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.ADELOT_D).getValor();
                }
                montoDescuentos = montoDescuentos.add(adtoOtros);

                //Descontamos la quinta categoria
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.QUINTA_D);
                if (objComun != null) {
                    dctoQuintaCat = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.QUINTA_D).getValor();
                }
                montoDescuentos = montoDescuentos.add(dctoQuintaCat);

                //Descontamos los prestamos
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.PRES_D);
                if (objComun != null) {
                    prestamo = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.PRES_D).getValor();
                }
                montoDescuentos = montoDescuentos.add(prestamo);

                //Descontamos el dcto judicial
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.JUDICIAL_D);
                if (objComun != null) {
                    dctoJudicial = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.JUDICIAL_D).getValor();
                }
                montoDescuentos = montoDescuentos.add(dctoJudicial);

                //Descontamos los dctos otros
                objComun = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.OTRDES_D);
                if (objComun != null) {
                    dctosOtros = obtenerConceptoPerioEmpConcep(listaConceptosPP, dto.getPeriodoDto().getId(), e.getId(), ConstantesPlan.ValoresConstantes.OTRDES_D).getValor();
                }
                montoDescuentos = montoDescuentos.add(dctosOtros);

                //SCTR

                if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
                    objPR = new PeriodoRemunDto();
                    //Llenamos los datos del objeto
                    objPR.setCalculoDto(dto);
                    objPR.setEmpleadoDto(e);
                    objPR.setTotalDctos(montoDescuentos);
                    objPR.setTotalRemuneracion(montoRemuneraciones);
                    objPR.setNeto(montoRemuneraciones.subtract(montoDescuentos));
                } else if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
                    objPR = periodoRemunManager.obtenerPorCalculoYPersona(dto.getId(), e.getId());
                    if (objPR == null) {
                        objPR = new PeriodoRemunDto();
                        objPR.setCalculoDto(dto);
                        objPR.setEmpleadoDto(e);
                        objPR.setTotalDctos(montoDescuentos);
                        objPR.setTotalRemuneracion(montoRemuneraciones);
                        objPR.setNeto(montoRemuneraciones.subtract(montoDescuentos));
                    } else {
                        objPR.setTotalDctos(montoDescuentos);
                        objPR.setTotalRemuneracion(montoRemuneraciones);
                        objPR.setNeto(montoRemuneraciones.subtract(montoDescuentos));
                    }
                }
                listaPR.add(objPR);
                
            }
        }
        //Guardarmos los valores calculados en cada concepto y trabajador
        perTrabConManager.nuevoMuchos(listaConceptosParaUpdate);
        return listaPR;
    }

    /**
     * obtenerConceptoPerioEmpConcep(): obtiene los conceptos por periodo, empleado y concepto
     * @since 10/01/2014
     * @param lst
     * @param idPeriodo
     * @param idEmp
     * @param idConcep
     * @return retorna la entidad PerTrabConDto
     */
    public PerTrabConDto obtenerConceptoPerioEmpConcep(List<PerTrabConDto> lst, Long idPeriodo, Long idEmp, Long idConcep) {
        for (PerTrabConDto x : lst) {
            if (x.getPeriodoDto().getId().equals(idPeriodo) && x.getEmpleadoDto().getId().equals(idEmp) && x.getConceptoPlanillaDto().getId().equals(idConcep)) {
                return x;
            }
        }
        return null;
    }

    /**
     * imprimirDto(): se encarga de generar un archivo en formato pdf
     * @since 10/01/2014
     * @param dto
     * @return retorna una cadena que representa el nombre del archivo reporte
     */
    public String imprimirDto(PeriodoRemunDto dto) {
        try {
            String nombreArchivoReporte = "BOLETA_" + dto.getCalculoDto().getNumBoleta() + "_" + dto.getEmpleadoDto().getId();
            HashMap parametros = new HashMap();
            parametros.put("P_IDENTIFICADOR", dto.getId());
            recursosManager.viewReportePdf(parametros, "RptBoletaPago", nombreArchivoReporte);
            return null;
        } catch (FileNotFoundException ex) {
            recursosManager.showError("EL ARCHIVO NO SE ENCUENTRA");
            logger.error(ex);
        } catch (JRException ex) {
            logger.error(ex);
            recursosManager.showError("ERROR EN LA COMPILACIÓN DEL REPORTE");
        } catch (IOException ex) {
            recursosManager.showError("EL ARCHIVO ESTÁ DAÑADO");
            logger.error(ex);
        } catch (SQLException ex) {
            logger.error(ex);
            recursosManager.showError("ERROR EN LA CONSULTA DEL REPORTE");
        } finally {
            return null;
        }
    }

    /**
     * obtenerMontoPorMinutoLaborado(): obtiene el monto por minuto laborado tomando como parametro los dias del periodo y el haber basico
     * @since 10/01/2014
     * @param diasPeriodo
     * @param haberBasico
     * @return retorna un valor decimal
     */
    public BigDecimal obtenerMontoPorMinutoLaborado(BigDecimal diasPeriodo, BigDecimal haberBasico) {
        BigDecimal monto = UtilCore.Numero.dividir(haberBasico, diasPeriodo.multiply(new BigDecimal("840")), applicationMBean.getPrecisionDecimales());
        return monto;
    }

    /**
     * obtenerMontoPorHoraLaborada(): obtiene el monto por hora laborada tomando como parametro los dias del periodo y el haber basico
     * @since 10/01/2014
     * @param diasPeriodo
     * @param haberBasico
     * @return retorna un valor decimal
     */
    public BigDecimal obtenerMontoPorHoraLaborada(BigDecimal diasPeriodo, BigDecimal haberBasico) {
        BigDecimal monto = UtilCore.Numero.dividir(haberBasico, diasPeriodo.multiply(new BigDecimal("8")), applicationMBean.getPrecisionDecimales());
        return monto;
    }

    /**
     * obtenerPorDiaLaborado(): obtiene el monto por dia laborado tomando como parametro los dias del periodo y el haber basico
     * @since 10/01/2014
     * @param diasPeriodo
     * @param haberBasico
     * @return retorna un valor decimal
     */
    public BigDecimal obtenerMontoPorDiaLaborado(BigDecimal diasPeriodo, BigDecimal haberBasico) {
        BigDecimal monto = UtilCore.Numero.dividir(haberBasico, diasPeriodo, applicationMBean.getPrecisionDecimales());
        return monto;
    }

    /**
     * validarDatosCalculo(): valida los datos del calculo
     * @since 10/01/2014
     * @param dto
     * @return retorna true o false dependiendo de la validación
     */
    public boolean validarDatosCalculo(CalculoDto dto) {
        try {
            if (obtenerCantCalculosPorPeriodo(dto) > 0) {
                return false;
            }
        } catch (DAOException ex) {
            logger.error(ex.getMessage());
            recursosManager.showError(ex.getMessage());
        }
        return true;
    }

    public String getUrl() {
        return url;
    }

    public String getUrlLista() {
        return urlLista;
    }

    public Long getIdEntidad() {
        return idEntidad;
    }

    public void setIdEntidad(Long idEntidad) {
        this.idEntidad = idEntidad;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        CalculoManager.logger = logger;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public DAOGenerico<CalculoDto> getSpringHibernateDao() {
        return springHibernateDao;
    }

    public void setSpringHibernateDao(DAOGenerico<CalculoDto> springHibernateDao) {
        this.springHibernateDao = springHibernateDao;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }
}
